knitr::opts_chunk$set(echo = TRUE)
library(tidyverse)
library(GGally)
Attaching package: ‘GGally’
The following object is masked from ‘package:dplyr’:
nasa
library(patchwork)
#Setting the data filepath
file_path <-"~/Documents/BI685Files/GitHubDocs/chronister_andrew/data"
sparrows_raw <- read_tsv(file.path(file_path, "sparrows.txt"))
Parsed with column specification:
cols(
wingcrd = [32mcol_double()[39m,
flatwing = [32mcol_double()[39m,
tarsus = [32mcol_double()[39m,
head = [32mcol_double()[39m,
culmen = [32mcol_double()[39m,
nalospi = [32mcol_double()[39m,
wt = [32mcol_double()[39m,
bandstat = [32mcol_double()[39m,
initials = [32mcol_double()[39m,
Year = [32mcol_double()[39m,
Month = [32mcol_double()[39m,
Day = [32mcol_double()[39m,
Location = [32mcol_double()[39m,
SpeciesCode = [32mcol_double()[39m,
Sex = [32mcol_double()[39m,
Age = [32mcol_double()[39m
)
View(sparrows_raw)
sparrows_raw
sparrows <- sparrows_raw %>%
mutate(box_group = "Sparrows",
row_order = 1:nrow(.))
View(sparrows)
#Figure 2: Outliers
plot_box <- sparrows %>%
ggplot(aes(x = box_group,
y = wingcrd))+
geom_boxplot(width = 0.25)+
labs(x = NULL,
y = "Wing length (mm)")
#Create Cleveland plot
plot_cleveland <- sparrows %>%
ggplot(aes(x = wingcrd,
y = row_order))+
geom_point()+
labs(x = "Wing length (mm)",
y = "Order of the data")
#Store plots into variables… #Plot both plots side by side.
plot_box + plot_cleveland

#Add Coordinate Flip so scales line up
plot_box + plot_cleveland + coord_flip()

#Create Culmen variable
p_culmen <- sparrows %>%
ggplot(aes(y = row_order)) +
geom_point(aes(x = culmen)) +
theme(axis.title.y = element_blank(),
axis.text.y = element_blank(),
axis.ticks.y = element_blank())
p_culmen

#Create nalospi variable
p_nalospi <- sparrows %>%
ggplot(aes(y = row_order)) +
geom_point(aes(x = nalospi)) +
theme(axis.title.y = element_blank(),
axis.text.y = element_blank(),
axis.ticks.y = element_blank())
p_nalospi

#Create wt variable
p_wt <- sparrows %>%
ggplot(aes(y = row_order)) +
geom_point(aes(x = wt)) +
theme(axis.title.y = element_blank(),
axis.text.y = element_blank(),
axis.ticks.y = element_blank())
p_wt

NA
#Create wingcrd variable (I’m using copy/paste on the three lines of theme because I’m lazy…)
p_wingcrd <- sparrows %>%
ggplot(aes(y = row_order)) +
geom_point(aes(x = wingcrd)) +
theme(axis.title.y = element_blank(),
axis.text.y = element_blank(),
axis.ticks.y = element_blank())
p_wingcrd

#Create tarsus variable
p_tarsus <- sparrows %>%
ggplot(aes(y = row_order))+
geom_point(aes(x = tarsus))+
theme(axis.title.y = element_blank(),
axis.text.y = element_blank(),
axis.ticks.y = element_blank())
p_tarsus

#Create head variable
p_head <- sparrows %>%
ggplot(aes(y = row_order)) +
geom_point(aes(x = head)) +
theme(axis.title.y = element_blank(),
axis.text.y = element_blank(),
axis.ticks.y = element_blank())
p_head

#Now, put them all together in one figure.
p_culmen <- sparrows %>%
ggplot(aes(y = row_order)) +
geom_point(aes(x = culmen)) +
theme(axis.title.y = element_blank(),
axis.text.y = element_blank(),
axis.ticks.y = element_blank())
p_nalospi <- sparrows %>%
ggplot(aes(y = row_order)) +
geom_point(aes(x = nalospi)) +
theme(axis.title.y = element_blank(),
axis.text.y = element_blank(),
axis.ticks.y = element_blank())
p_wt <- sparrows %>%
ggplot(aes(y = row_order)) +
geom_point(aes(x = wt)) +
theme(axis.title.y = element_blank(),
axis.text.y = element_blank(),
axis.ticks.y = element_blank())
p_wingcrd <- sparrows %>%
ggplot(aes(y = row_order)) +
geom_point(aes(x = wingcrd)) +
theme(axis.title.y = element_blank(),
axis.text.y = element_blank(),
axis.ticks.y = element_blank())
p_tarsus <- sparrows %>%
ggplot(aes(y = row_order))+
geom_point(aes(x = tarsus))+
theme(axis.title.y = element_blank(),
axis.text.y = element_blank(),
axis.ticks.y = element_blank())
p_head <- sparrows %>%
ggplot(aes(y = row_order)) +
geom_point(aes(x = head)) +
theme(axis.title.y = element_blank(),
axis.text.y = element_blank(),
axis.ticks.y = element_blank())
p_culmen + p_nalospi + p_wt + p_wingcrd + p_tarsus + p_head + plot_layout(ncol = 3, nrow = 2)

#It looks like there is one possible outlier in nalospi, one in wingcrd, one in tarsus and two in head. All of these would need further consideration, just like the wingcrd example, to determine if the value is practical or an error.
####Figure 5 #First code block to re-create the histogram
h1 <- sparrows %>%
filter(Month %in% 6:8) %>%
ggplot() +
geom_histogram(aes(x = wt),
binwidth = 0.5,
boundary = 0,
closed = "right",
color = "black") +
scale_x_continuous(breaks = seq(14,28,by = 2))
h1

#Filter all but June, July and August, etc.
h2 <- sparrows %>%
filter(Month %in% 6:8) %>%
mutate(Month = case_when(
Month == 6 ~ "June",
Month == 7 ~ "July",
Month == 8 ~ "August")) %>%
ggplot() +
geom_histogram(aes(x = wt),
binwidth = 0.5,
boundary = 0,
color = "black") +
scale_x_continuous(breaks = seq(14,28,by = 2)) +
facet_wrap(~Month, ncol = 1)
h2

#Now assemble into one figure.
h1 + h2

#Grad/Honors density plot. #Left panel playground(where I’ll figure out how to do it)
dp_1 <- sparrows %>%
filter(Month %in% 6:8) %>%
ggplot() +
geom_density(aes(x = wt)) +
scale_x_continuous(breaks = seq(14,28, by = 2))
dp_1

#Ok. That looks similar enough to the example in the notes. Now, on to the filled density plot trinity. Breakthrough. That is kinda pretty…
dp_2 <- sparrows %>%
filter(Month %in% 6:8)%>%
mutate(Month = case_when(
Month == 6 ~ "June",
Month == 7 ~ "July",
Month == 8 ~ "August")) %>%
ggplot()+
geom_density(aes(x = wt,
fill = Month),
alpha = 0.42)+
scale_x_continuous(breaks = seq(14, 28, by = 2))
dp_2

#Now simply put the two together.
dp_1 + dp_2 + plot_layout(nrow = 1)

#Create ggscatmat plot of data using first 7 columns
sparrows %>% ggscatmat(columns = 1:7)

#Tis a thing of beauty, and really, really easy.
#Figure 11: Interactions
month_order <- c("May", "June", "July", "August", "September")
sparrows %>%
filter(Month %in% 5:9,
Sex != 0) %>%
mutate(Month = case_when(
Month == 5 ~ "May",
Month == 6 ~ "June",
Month == 7 ~ "July",
Month == 8 ~ "August",
Month == 9 ~ "September"),
Month = factor(Month, levels = month_order, ordered = TRUE),
Sex = ifelse(Sex == 4, "Male", "Female")) %>%
ggplot(aes(x = wingcrd,
y = wt))+
geom_point()+
geom_smooth(method = lm, se = FALSE)+
facet_grid(Sex ~ Month)

Part 2:Aegla Crab-fest
#import the raw data
aegla_raw <- read_csv(file.path(file_path, "aegla_crabs.csv"))
Parsed with column specification:
cols(
.default = col_double(),
Site = [31mcol_character()[39m
)
See spec(...) for full column specifications.
aegla_raw
#Select to remove certain columns
aegla_select <- select(aegla_raw, -Site, -AT, -WT, -Shrimp, -Aeglam, -AeglaFe, -AeglaFo)
aegla_select
#Use drop_na to drop row with NAs
aegla_dropna <- aegla_select %>%
drop_na(4:12)
aegla_dropna
#Create the row_order dummy variable
aegla_clean <- aegla_dropna %>%
mutate(box_group = "Crabs",
row_order = 1:nrow(.))
aegla_clean
#Trying the more efficient pipe method.
aegla <- aegla_raw %>%
select(-c("Site", "AT", "WT", "Shrimp", "Aeglam", "AeglaFe", "AeglaFo"))%>%
drop_na(c("N"))%>%
mutate(box_group = "Crabs",
row_order = 1:nrow(.))
aegla
#Explore the data
p_width <- aegla %>%
ggplot(aes(x=row_order))+
geom_point(aes(y=Width))
p_depth <- aegla %>%
ggplot(aes(x=row_order))+
geom_point(aes(y=Depth))
p_flow <- aegla %>%
ggplot(aes(x=row_order))+
geom_point(aes(y=Flow))
p_ph <- aegla %>%
ggplot(aes(x=row_order))+
geom_point(aes(y=pH))
p_tds <- aegla %>%
ggplot(aes(x=row_order))+
geom_point(aes(y=TDS))
p_cond<- aegla %>%
ggplot(aes(x=row_order))+
geom_point(aes(y=Cond))
p_n <- aegla %>%
ggplot(aes(x=row_order))+
geom_point(aes(y=N))
p_ni <- aegla %>%
ggplot(aes(x=row_order))+
geom_point(aes(y=Ni))
p_nt <- aegla %>%
ggplot(aes(x=row_order))+
geom_point(aes(y=Nt))
p_phos <- aegla %>%
ggplot(aes(x=row_order))+
geom_point(aes(y=Phos))
p_mg <- aegla %>%
ggplot(aes(x=row_order))+
geom_point(aes(y=Mg))
p_ca <- aegla %>%
ggplot(aes(x=row_order))+
geom_point(aes(y=Ca))
p_crab <- aegla %>%
ggplot(aes(x=row_order))+
geom_point(aes(y=Crab))
p_width + p_depth + p_flow

p_ph + p_tds + p_cond

p_n + p_ni + p_nt

p_phos + p_mg + p_ca + p_crab

ggplot(aegla, aes(x=row_order, y=Phos))+
geom_boxplot()+
geom_point()

#The outliers I found are sample 1, where the Phosphate levels are almost 4 times higher than the next highest value, sample 14 has low pH at 6.25, with the next lowest measurement being 6.75 and 0 waterflow, and sample 22 was taken at a width of 12.5 (meters?) and a depth of 5 meters. The width measurement is not much of an outlier, but the depth measurement is twice as deep as the next highest value. I would contend that the real outlier is the phosphate level in sample 1.
#Plot four variables with a Cleveland plot. It just so happened that I made plots for all of the variables…
p_width + p_depth + p_cond + p_crab + plot_layout(nrow = 2, ncol = 2)

#Make three histograms
ha1 <- ggplot(data = aegla)+
geom_histogram(aes(x = N),
binwidth = .0025,
boundary = 0,
closed = "right",
color = "black")
ha1

NA
NA
NA
ha2 <- ggplot(data = aegla)+
geom_histogram(aes(x=Phos),
binwidth = .005,
boundary = 0,
closed = "right",
color = "blue")
ha2

ha3 <- ggplot(aegla)+
geom_histogram(aes(x=pH),
binwidth = .005,
boundary = 0,
closed = "right",
color = "red")
ha3

#Create density plots
hdp1 <- ggplot(aegla)+
geom_density(aes(x=N))
hdp1

hdp2 <- ggplot(aegla)+
geom_density(aes(x=Phos))
hdp2

hdp3 <- ggplot(aegla)+
geom_density(aes(x=pH))
hdp3

#Use patchwork to produce 2 col matrix
ha1 + hdp1 + ha2 + hdp2 + ha3 + hdp3 + plot_layout(ncol=2, nrow = 3)

#ggpairs plot… see what happens.
aegla %>% ggpairs

#Wow. That is a huge table. I’m going to use ggscatmat for a different view.

aegla %>% ggscatmat()
Factor variables are omitted in plot

#I’d say there are too many variables going on to be useful. But if we pare it down a bit…
aegla %>% ggpairs(columns = 1:6)

#This makes a lot more sense. TDS and Conductivity have a strong correlation, which makes sense with solids desoved in the water, pH and TDS have a pretty good correlation which also makes sense. I’ll try with the other variables.
aegla %>% ggpairs(columns = 7:13)

LS0tCnRpdGxlOiAiSFcgMDcgUGFydCAxOiBEYXRhIFZpc3VhbGl6YXRpb24iCmF1dGhvcjogIkFuZHJldyBDaHJvbmlzdGVyIgpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiAlWScpYCIKb3V0cHV0OiBodG1sX25vdGVib29rCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCi0tLQpgYGB7cn0KCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoR0dhbGx5KQpsaWJyYXJ5KHBhdGNod29yaykKYGBgCgojU2V0dGluZyB0aGUgZGF0YSBmaWxlcGF0aApgYGB7cn0KZmlsZV9wYXRoIDwtIn4vRG9jdW1lbnRzL0JJNjg1RmlsZXMvR2l0SHViRG9jcy9jaHJvbmlzdGVyX2FuZHJldy9kYXRhIgpzcGFycm93c19yYXcgPC0gcmVhZF90c3YoZmlsZS5wYXRoKGZpbGVfcGF0aCwgInNwYXJyb3dzLnR4dCIpKQpWaWV3KHNwYXJyb3dzX3JhdykKc3BhcnJvd3NfcmF3CmBgYApgYGB7cn0Kc3BhcnJvd3MgPC0gc3BhcnJvd3NfcmF3ICU+JQogIG11dGF0ZShib3hfZ3JvdXAgPSAiU3BhcnJvd3MiLAogICAgICAgICByb3dfb3JkZXIgPSAxOm5yb3coLikpClZpZXcoc3BhcnJvd3MpCmBgYAojRmlndXJlIDI6IE91dGxpZXJzIApgYGB7cn0KcGxvdF9ib3ggPC0gc3BhcnJvd3MgJT4lCiAgZ2dwbG90KGFlcyh4ID0gYm94X2dyb3VwLAogICAgICAgICAgICAgeSA9IHdpbmdjcmQpKSsKICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjI1KSsKICBsYWJzKHggPSBOVUxMLAogICAgICAgeSA9ICJXaW5nIGxlbmd0aCAobW0pIikKYGBgCiNDcmVhdGUgQ2xldmVsYW5kIHBsb3QKYGBge3J9CnBsb3RfY2xldmVsYW5kIDwtIHNwYXJyb3dzICU+JQogIGdncGxvdChhZXMoeCA9IHdpbmdjcmQsCiAgICAgICAgICAgICB5ID0gcm93X29yZGVyKSkrCiAgZ2VvbV9wb2ludCgpKwogIGxhYnMoeCA9ICJXaW5nIGxlbmd0aCAobW0pIiwKICAgICAgIHkgPSAiT3JkZXIgb2YgdGhlIGRhdGEiKQpgYGAKI1N0b3JlIHBsb3RzIGludG8gdmFyaWFibGVzLi4uCiNQbG90IGJvdGggcGxvdHMgc2lkZSBieSBzaWRlLgpgYGB7cn0KcGxvdF9ib3ggKyBwbG90X2NsZXZlbGFuZApgYGAKI0FkZCBDb29yZGluYXRlIEZsaXAgc28gc2NhbGVzIGxpbmUgdXAKYGBge3J9CnBsb3RfYm94ICsgcGxvdF9jbGV2ZWxhbmQgKyBjb29yZF9mbGlwKCkKYGBgCiNDcmVhdGUgQ3VsbWVuIHZhcmlhYmxlCmBgYHtyfQpwX2N1bG1lbiA8LSAgc3BhcnJvd3MgJT4lCiAgZ2dwbG90KGFlcyh5ID0gcm93X29yZGVyKSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBjdWxtZW4pKSArCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSkKcF9jdWxtZW4KYGBgCiNDcmVhdGUgbmFsb3NwaSB2YXJpYWJsZQpgYGB7cn0KcF9uYWxvc3BpIDwtIHNwYXJyb3dzICU+JQogIGdncGxvdChhZXMoeSA9IHJvd19vcmRlcikpICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbmFsb3NwaSkpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKQpwX25hbG9zcGkKYGBgCiNDcmVhdGUgd3QgdmFyaWFibGUKYGBge3J9CnBfd3QgPC0gc3BhcnJvd3MgJT4lCiAgZ2dwbG90KGFlcyh5ID0gcm93X29yZGVyKSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSB3dCkpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKQpwX3d0CiAgCmBgYAojQ3JlYXRlIHdpbmdjcmQgdmFyaWFibGUgKEknbSB1c2luZyBjb3B5L3Bhc3RlIG9uIHRoZSB0aHJlZSBsaW5lcyBvZiB0aGVtZSBiZWNhdXNlIEknbSBsYXp5Li4uKQpgYGB7cn0KcF93aW5nY3JkIDwtIHNwYXJyb3dzICU+JQogIGdncGxvdChhZXMoeSA9IHJvd19vcmRlcikpICsKICBnZW9tX3BvaW50KGFlcyh4ID0gd2luZ2NyZCkpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKQpwX3dpbmdjcmQKYGBgCiNDcmVhdGUgdGFyc3VzIHZhcmlhYmxlCmBgYHtyfQpwX3RhcnN1cyA8LSBzcGFycm93cyAlPiUKICBnZ3Bsb3QoYWVzKHkgPSByb3dfb3JkZXIpKSsKICBnZW9tX3BvaW50KGFlcyh4ID0gdGFyc3VzKSkrCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSkKcF90YXJzdXMKYGBgCiNDcmVhdGUgaGVhZCB2YXJpYWJsZQpgYGB7cn0KcF9oZWFkIDwtIHNwYXJyb3dzICU+JQogIGdncGxvdChhZXMoeSA9IHJvd19vcmRlcikpICsKICBnZW9tX3BvaW50KGFlcyh4ID0gaGVhZCkpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKQpwX2hlYWQKYGBgCiNOb3csIHB1dCB0aGVtIGFsbCB0b2dldGhlciBpbiBvbmUgZmlndXJlLiAKYGBge3J9CnBfY3VsbWVuIDwtICBzcGFycm93cyAlPiUKICBnZ3Bsb3QoYWVzKHkgPSByb3dfb3JkZXIpKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGN1bG1lbikpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKQpwX25hbG9zcGkgPC0gc3BhcnJvd3MgJT4lCiAgZ2dwbG90KGFlcyh5ID0gcm93X29yZGVyKSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBuYWxvc3BpKSkgKwogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkpCnBfd3QgPC0gc3BhcnJvd3MgJT4lCiAgZ2dwbG90KGFlcyh5ID0gcm93X29yZGVyKSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSB3dCkpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKQpwX3dpbmdjcmQgPC0gc3BhcnJvd3MgJT4lCiAgZ2dwbG90KGFlcyh5ID0gcm93X29yZGVyKSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSB3aW5nY3JkKSkgKwogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkpCnBfdGFyc3VzIDwtIHNwYXJyb3dzICU+JQogIGdncGxvdChhZXMoeSA9IHJvd19vcmRlcikpKwogIGdlb21fcG9pbnQoYWVzKHggPSB0YXJzdXMpKSsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKQpwX2hlYWQgPC0gc3BhcnJvd3MgJT4lCiAgZ2dwbG90KGFlcyh5ID0gcm93X29yZGVyKSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBoZWFkKSkgKwogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkpCnBfY3VsbWVuICsgcF9uYWxvc3BpICsgcF93dCArIHBfd2luZ2NyZCArIHBfdGFyc3VzICsgcF9oZWFkICsgcGxvdF9sYXlvdXQobmNvbCA9IDMsIG5yb3cgPSAyKQpgYGAKI0l0IGxvb2tzIGxpa2UgdGhlcmUgaXMgb25lIHBvc3NpYmxlIG91dGxpZXIgaW4gbmFsb3NwaSwgb25lIGluIHdpbmdjcmQsIG9uZSBpbiB0YXJzdXMgYW5kIHR3byBpbiBoZWFkLiBBbGwgb2YgdGhlc2Ugd291bGQgbmVlZCBmdXJ0aGVyIGNvbnNpZGVyYXRpb24sIGp1c3QgbGlrZSB0aGUgd2luZ2NyZCBleGFtcGxlLCB0byBkZXRlcm1pbmUgaWYgdGhlIHZhbHVlIGlzIHByYWN0aWNhbCBvciBhbiBlcnJvci4gCgojIyMjRmlndXJlIDUKI0ZpcnN0IGNvZGUgYmxvY2sgdG8gcmUtY3JlYXRlIHRoZSBoaXN0b2dyYW0KYGBge3J9CmgxIDwtIHNwYXJyb3dzICU+JQogIGZpbHRlcihNb250aCAlaW4lIDY6OCkgJT4lCiAgZ2dwbG90KCkgKwogIGdlb21faGlzdG9ncmFtKGFlcyh4ID0gd3QpLAogICAgICAgICAgICAgICAgIGJpbndpZHRoID0gMC41LAogICAgICAgICAgICAgICAgIGJvdW5kYXJ5ID0gMCwKICAgICAgICAgICAgICAgICBjbG9zZWQgPSAicmlnaHQiLAogICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMTQsMjgsYnkgPSAyKSkKaDEKYGBgCiNGaWx0ZXIgYWxsIGJ1dCBKdW5lLCBKdWx5IGFuZCBBdWd1c3QsIGV0Yy4KYGBge3J9CmgyIDwtIHNwYXJyb3dzICU+JQogIGZpbHRlcihNb250aCAlaW4lIDY6OCkgJT4lCiAgbXV0YXRlKE1vbnRoID0gY2FzZV93aGVuKAogICAgTW9udGggPT0gNiB+ICJKdW5lIiwKICAgIE1vbnRoID09IDcgfiAiSnVseSIsCiAgICBNb250aCA9PSA4IH4gIkF1Z3VzdCIpKSAlPiUKICBnZ3Bsb3QoKSArCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHggPSB3dCksCiAgICAgICAgICAgICAgICAgYmlud2lkdGggPSAwLjUsCiAgICAgICAgICAgICAgICAgYm91bmRhcnkgPSAwLAogICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMTQsMjgsYnkgPSAyKSkgKwogIGZhY2V0X3dyYXAofk1vbnRoLCBuY29sID0gMSkKaDIKYGBgCiNOb3cgYXNzZW1ibGUgaW50byBvbmUgZmlndXJlLgpgYGB7cn0KaDEgKyBoMgpgYGAKI0dyYWQvSG9ub3JzIGRlbnNpdHkgcGxvdC4KI0xlZnQgcGFuZWwgcGxheWdyb3VuZCh3aGVyZSBJJ2xsIGZpZ3VyZSBvdXQgaG93IHRvIGRvIGl0KQpgYGB7cn0KZHBfMSA8LSBzcGFycm93cyAlPiUKICBmaWx0ZXIoTW9udGggJWluJSA2OjgpICU+JQogIGdncGxvdCgpICsKICBnZW9tX2RlbnNpdHkoYWVzKHggPSB3dCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDE0LDI4LCBieSA9IDIpKQpkcF8xCmBgYAojT2suIFRoYXQgbG9va3Mgc2ltaWxhciBlbm91Z2ggdG8gdGhlIGV4YW1wbGUgaW4gdGhlIG5vdGVzLiAgTm93LCBvbiB0byB0aGUgZmlsbGVkIGRlbnNpdHkgcGxvdCB0cmluaXR5LiAgQnJlYWt0aHJvdWdoLiBUaGF0IGlzIGtpbmRhIHByZXR0eS4uLgpgYGB7cn0KZHBfMiA8LSBzcGFycm93cyAlPiUKICBmaWx0ZXIoTW9udGggJWluJSA2OjgpJT4lCiAgbXV0YXRlKE1vbnRoID0gY2FzZV93aGVuKAogICAgTW9udGggPT0gNiB+ICJKdW5lIiwKICAgIE1vbnRoID09IDcgfiAiSnVseSIsCiAgICBNb250aCA9PSA4IH4gIkF1Z3VzdCIpKSAlPiUKICBnZ3Bsb3QoKSsKICBnZW9tX2RlbnNpdHkoYWVzKHggPSB3dCwKICAgICAgICAgICAgICAgICAgIGZpbGwgPSBNb250aCksCiAgICAgICAgICAgICAgIGFscGhhID0gMC40MikrCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxNCwgMjgsIGJ5ID0gMikpCmRwXzIKYGBgCiNOb3cgc2ltcGx5IHB1dCB0aGUgdHdvIHRvZ2V0aGVyLiAKYGBge3J9CmRwXzEgKyBkcF8yICsgcGxvdF9sYXlvdXQobnJvdyA9IDEpCmBgYAojQ3JlYXRlIGdnc2NhdG1hdCBwbG90IG9mIGRhdGEgdXNpbmcgZmlyc3QgNyBjb2x1bW5zCmBgYHtyfQpzcGFycm93cyAlPiUgZ2dzY2F0bWF0KGNvbHVtbnMgPSAxOjcpCmBgYAojVGlzIGEgdGhpbmcgb2YgYmVhdXR5LCBhbmQgcmVhbGx5LCByZWFsbHkgZWFzeS4gIAoKI0ZpZ3VyZSAxMTogSW50ZXJhY3Rpb25zCmBgYHtyfQptb250aF9vcmRlciA8LSAgYygiTWF5IiwgIkp1bmUiLCAiSnVseSIsICJBdWd1c3QiLCAiU2VwdGVtYmVyIikKc3BhcnJvd3MgJT4lCiAgZmlsdGVyKE1vbnRoICVpbiUgNTo5LAogICAgICAgICBTZXggIT0gMCkgJT4lCiAgbXV0YXRlKE1vbnRoID0gY2FzZV93aGVuKAogICAgTW9udGggPT0gNSB+ICJNYXkiLAogICAgTW9udGggPT0gNiB+ICJKdW5lIiwKICAgIE1vbnRoID09IDcgfiAiSnVseSIsCiAgICBNb250aCA9PSA4IH4gIkF1Z3VzdCIsCiAgICBNb250aCA9PSA5IH4gIlNlcHRlbWJlciIpLAogICAgTW9udGggPSBmYWN0b3IoTW9udGgsIGxldmVscyA9IG1vbnRoX29yZGVyLCBvcmRlcmVkID0gVFJVRSksCiAgICBTZXggPSBpZmVsc2UoU2V4ID09IDQsICJNYWxlIiwgIkZlbWFsZSIpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB3aW5nY3JkLAogICAgICAgICAgICAgeSA9IHd0KSkrCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBzZSA9IEZBTFNFKSsKICBmYWNldF9ncmlkKFNleCB+IE1vbnRoKQpgYGAKIyMjIyBQYXJ0IDI6QWVnbGEgQ3JhYi1mZXN0IAojaW1wb3J0IHRoZSByYXcgZGF0YQpgYGB7cn0KYWVnbGFfcmF3IDwtIHJlYWRfY3N2KGZpbGUucGF0aChmaWxlX3BhdGgsICJhZWdsYV9jcmFicy5jc3YiKSkKYWVnbGFfcmF3CmBgYAojU2VsZWN0IHRvIHJlbW92ZSBjZXJ0YWluIGNvbHVtbnMKYGBge3J9CmFlZ2xhX3NlbGVjdCA8LSBzZWxlY3QoYWVnbGFfcmF3LCAtU2l0ZSwgLUFULCAtV1QsIC1TaHJpbXAsIC1BZWdsYW0sIC1BZWdsYUZlLCAtQWVnbGFGbykKYWVnbGFfc2VsZWN0CmBgYAojVXNlIGRyb3BfbmEgdG8gZHJvcCByb3cgd2l0aCBOQXMKYGBge3J9CmFlZ2xhX2Ryb3BuYSA8LSBhZWdsYV9zZWxlY3QgJT4lCiAgZHJvcF9uYSg0OjEyKQphZWdsYV9kcm9wbmEKYGBgCiNDcmVhdGUgdGhlIHJvd19vcmRlciBkdW1teSB2YXJpYWJsZQpgYGB7cn0KYWVnbGFfY2xlYW4gPC0gYWVnbGFfZHJvcG5hICU+JQogIG11dGF0ZShib3hfZ3JvdXAgPSAiQ3JhYnMiLAogICAgICAgICByb3dfb3JkZXIgPSAxOm5yb3coLikpCmFlZ2xhX2NsZWFuCmBgYAojVHJ5aW5nIHRoZSBtb3JlIGVmZmljaWVudCBwaXBlIG1ldGhvZC4KYGBge3J9CmFlZ2xhIDwtIGFlZ2xhX3JhdyAlPiUKICBzZWxlY3QoLWMoIlNpdGUiLCAiQVQiLCAiV1QiLCAiU2hyaW1wIiwgIkFlZ2xhbSIsICJBZWdsYUZlIiwgIkFlZ2xhRm8iKSklPiUKICBkcm9wX25hKGMoIk4iKSklPiUKICBtdXRhdGUoYm94X2dyb3VwID0gIkNyYWJzIiwKICAgICAgICAgcm93X29yZGVyID0gMTpucm93KC4pKQphZWdsYQpgYGAKI0V4cGxvcmUgdGhlIGRhdGEKYGBge3J9CnBfd2lkdGggPC0gYWVnbGEgJT4lCiAgZ2dwbG90KGFlcyh4PXJvd19vcmRlcikpKwogIGdlb21fcG9pbnQoYWVzKHk9V2lkdGgpKQpwX2RlcHRoIDwtIGFlZ2xhICU+JQogIGdncGxvdChhZXMoeD1yb3dfb3JkZXIpKSsKICBnZW9tX3BvaW50KGFlcyh5PURlcHRoKSkKcF9mbG93IDwtIGFlZ2xhICU+JQogIGdncGxvdChhZXMoeD1yb3dfb3JkZXIpKSsKICBnZW9tX3BvaW50KGFlcyh5PUZsb3cpKQpwX3BoIDwtIGFlZ2xhICU+JQogIGdncGxvdChhZXMoeD1yb3dfb3JkZXIpKSsKICBnZW9tX3BvaW50KGFlcyh5PXBIKSkKcF90ZHMgPC0gYWVnbGEgJT4lCiAgZ2dwbG90KGFlcyh4PXJvd19vcmRlcikpKwogIGdlb21fcG9pbnQoYWVzKHk9VERTKSkKcF9jb25kPC0gYWVnbGEgJT4lCiAgZ2dwbG90KGFlcyh4PXJvd19vcmRlcikpKwogIGdlb21fcG9pbnQoYWVzKHk9Q29uZCkpCnBfbiA8LSBhZWdsYSAlPiUKICBnZ3Bsb3QoYWVzKHg9cm93X29yZGVyKSkrCiAgZ2VvbV9wb2ludChhZXMoeT1OKSkKcF9uaSA8LSBhZWdsYSAlPiUKICBnZ3Bsb3QoYWVzKHg9cm93X29yZGVyKSkrCiAgZ2VvbV9wb2ludChhZXMoeT1OaSkpCnBfbnQgPC0gYWVnbGEgJT4lCiAgZ2dwbG90KGFlcyh4PXJvd19vcmRlcikpKwogIGdlb21fcG9pbnQoYWVzKHk9TnQpKQpwX3Bob3MgPC0gYWVnbGEgJT4lCiAgZ2dwbG90KGFlcyh4PXJvd19vcmRlcikpKwogIGdlb21fcG9pbnQoYWVzKHk9UGhvcykpCnBfbWcgPC0gYWVnbGEgJT4lCiAgZ2dwbG90KGFlcyh4PXJvd19vcmRlcikpKwogIGdlb21fcG9pbnQoYWVzKHk9TWcpKQpwX2NhIDwtIGFlZ2xhICU+JQogIGdncGxvdChhZXMoeD1yb3dfb3JkZXIpKSsKICBnZW9tX3BvaW50KGFlcyh5PUNhKSkKcF9jcmFiIDwtIGFlZ2xhICU+JQogIGdncGxvdChhZXMoeD1yb3dfb3JkZXIpKSsKICBnZW9tX3BvaW50KGFlcyh5PUNyYWIpKQpwX3dpZHRoICsgcF9kZXB0aCArIHBfZmxvdyAKCmBgYAoKYGBge3J9CnBfcGggKyBwX3RkcyArIHBfY29uZCAgCmBgYApgYGB7cn0KcF9uICsgcF9uaSArIHBfbnQgCmBgYAoKYGBge3J9CnBfcGhvcyArIHBfbWcgKyBwX2NhICsgcF9jcmFiCmBgYApgYGB7cn0KZ2dwbG90KGFlZ2xhLCBhZXMoeD1yb3dfb3JkZXIsIHk9UGhvcykpKwogIGdlb21fYm94cGxvdCgpKwogIGdlb21fcG9pbnQoKQpgYGAKI1RoZSBvdXRsaWVycyBJIGZvdW5kIGFyZSBzYW1wbGUgMSwgd2hlcmUgdGhlIFBob3NwaGF0ZSBsZXZlbHMgYXJlIGFsbW9zdCA0IHRpbWVzIGhpZ2hlciB0aGFuIHRoZSBuZXh0IGhpZ2hlc3QgdmFsdWUsIHNhbXBsZSAxNCBoYXMgbG93IHBIIGF0IDYuMjUsIHdpdGggdGhlIG5leHQgbG93ZXN0IG1lYXN1cmVtZW50IGJlaW5nIDYuNzUgYW5kIDAgd2F0ZXJmbG93LCBhbmQgc2FtcGxlIDIyIHdhcyB0YWtlbiBhdCBhIHdpZHRoIG9mIDEyLjUgKG1ldGVycz8pIGFuZCBhIGRlcHRoIG9mIDUgbWV0ZXJzLiAgVGhlIHdpZHRoIG1lYXN1cmVtZW50IGlzIG5vdCBtdWNoIG9mIGFuIG91dGxpZXIsIGJ1dCB0aGUgZGVwdGggbWVhc3VyZW1lbnQgaXMgdHdpY2UgYXMgZGVlcCBhcyB0aGUgbmV4dCBoaWdoZXN0IHZhbHVlLiAgSSB3b3VsZCBjb250ZW5kIHRoYXQgdGhlIHJlYWwgb3V0bGllciBpcyB0aGUgcGhvc3BoYXRlIGxldmVsIGluIHNhbXBsZSAxLiAgCgojUGxvdCBmb3VyIHZhcmlhYmxlcyB3aXRoIGEgQ2xldmVsYW5kIHBsb3QuIEl0IGp1c3Qgc28gaGFwcGVuZWQgdGhhdCBJIG1hZGUgcGxvdHMgZm9yIGFsbCBvZiB0aGUgdmFyaWFibGVzLi4uIApgYGB7cn0KcF93aWR0aCArIHBfZGVwdGggKyBwX2NvbmQgKyBwX2NyYWIgKyBwbG90X2xheW91dChucm93ID0gMiwgbmNvbCA9IDIpCmBgYAojTWFrZSB0aHJlZSBoaXN0b2dyYW1zCmBgYHtyfQpoYTEgPC0gZ2dwbG90KGRhdGEgPSBhZWdsYSkrCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHggPSBOKSwKICAgICAgICAgICAgICAgICBiaW53aWR0aCA9IC4wMDI1LAogICAgICAgICAgICAgICAgIGJvdW5kYXJ5ID0gMCwKICAgICAgICAgICAgICAgICBjbG9zZWQgPSAicmlnaHQiLAogICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIikKaGExCgoKCmBgYApgYGB7cn0KaGEyIDwtIGdncGxvdChkYXRhID0gYWVnbGEpKwogIGdlb21faGlzdG9ncmFtKGFlcyh4PVBob3MpLAogICAgICAgICAgICAgICAgIGJpbndpZHRoID0gLjAwNSwKICAgICAgICAgICAgICAgICBib3VuZGFyeSA9IDAsCiAgICAgICAgICAgICAgICAgY2xvc2VkID0gInJpZ2h0IiwKICAgICAgICAgICAgICAgICBjb2xvciA9ICJibHVlIikKaGEyCmBgYApgYGB7cn0KaGEzIDwtICBnZ3Bsb3QoYWVnbGEpKwogIGdlb21faGlzdG9ncmFtKGFlcyh4PXBIKSwKICAgICAgICAgICAgICAgICBiaW53aWR0aCA9IC4wMDUsCiAgICAgICAgICAgICAgICAgYm91bmRhcnkgPSAwLAogICAgICAgICAgICAgICAgIGNsb3NlZCA9ICJyaWdodCIsCiAgICAgICAgICAgICAgICAgY29sb3IgPSAicmVkIikKaGEzCmBgYAojQ3JlYXRlIGRlbnNpdHkgcGxvdHMKYGBge3J9CmhkcDEgPC0gZ2dwbG90KGFlZ2xhKSsKICBnZW9tX2RlbnNpdHkoYWVzKHg9TikpCmhkcDEKCmBgYApgYGB7cn0KaGRwMiA8LSBnZ3Bsb3QoYWVnbGEpKwogIGdlb21fZGVuc2l0eShhZXMoeD1QaG9zKSkKaGRwMgpgYGAKYGBge3J9CmhkcDMgPC0gZ2dwbG90KGFlZ2xhKSsKICBnZW9tX2RlbnNpdHkoYWVzKHg9cEgpKQpoZHAzCmBgYAojVXNlIHBhdGNod29yayB0byBwcm9kdWNlIDIgY29sIG1hdHJpeApgYGB7cn0KaGExICsgaGRwMSArIGhhMiArIGhkcDIgKyBoYTMgKyBoZHAzICsgcGxvdF9sYXlvdXQobmNvbD0yLCBucm93ID0gMykKYGBgCiNnZ3BhaXJzIHBsb3QuLi4gc2VlIHdoYXQgaGFwcGVucy4KYGBge3J9CmFlZ2xhICU+JSBnZ3BhaXJzCmBgYAojV293LiBUaGF0IGlzIGEgaHVnZSB0YWJsZS4gSSdtIGdvaW5nIHRvIHVzZSBnZ3NjYXRtYXQgZm9yIGEgZGlmZmVyZW50IHZpZXcuCmBgYHtyfQphZWdsYSAlPiUgZ2dzY2F0bWF0KCkKYGBgCiNJJ2Qgc2F5IHRoZXJlIGFyZSB0b28gbWFueSB2YXJpYWJsZXMgZ29pbmcgb24gdG8gYmUgdXNlZnVsLiAgQnV0IGlmIHdlIHBhcmUgaXQgZG93biBhIGJpdC4uLgpgYGB7cn0KYWVnbGEgJT4lIGdncGFpcnMoY29sdW1ucyA9IDE6NikKYGBgCiNUaGlzIG1ha2VzIGEgbG90IG1vcmUgc2Vuc2UuICBURFMgYW5kIENvbmR1Y3Rpdml0eSBoYXZlIGEgc3Ryb25nIGNvcnJlbGF0aW9uLCB3aGljaCBtYWtlcyBzZW5zZSB3aXRoIHNvbGlkcyBkZXNvdmVkIGluIHRoZSB3YXRlciwgcEggYW5kIFREUyBoYXZlIGEgcHJldHR5IGdvb2QgY29ycmVsYXRpb24gd2hpY2ggYWxzbyBtYWtlcyBzZW5zZS4gIEknbGwgdHJ5IHdpdGggdGhlIG90aGVyIHZhcmlhYmxlcy4gCgpgYGB7cn0KYWVnbGEgJT4lIGdncGFpcnMoY29sdW1ucyA9IDc6MTMpCmBgYAoKCgo=